﻿package  code.ws_common_scene.map{
	
	import flash.utils.ByteArray;
	import flash.utils.Endian;
	
	/**
	 * 地图数据
	 * @author qiangchen
	 * 
	 */	
	public class MapData {
		
		/** 地图id */
		private var _mapId:String;
		/** 地图宽度 */
		private var _mapW:uint;
		/** 地图高度 */
		private var _mapH:uint;
		/** 地图格子宽度一半 */
		private var _hTileH:uint;
		/** 地图格子高度一半 */
		private var _hTileW:uint;
		/** 地图格子宽度 */
		private var _tileW:uint;
		/** 地图格子高度 */
		private var _tileH:uint;
		/** 地图切片宽度 */
		private var _sliceW:uint;
		/** 地图切片高度 */
		private var _sliceH:uint;
		/** 列 */
		private var _col:int = NaN;
		/** 行 */
		private var _row:int = NaN;
		/** 格子数组 */
		private var _nodeAry:Array = [];
		
		
		
		/**
		 * 构造函数 
		 * 
		 */		
		public function MapData() {
			// constructor code
		}
		
		
		
		/**
		 * 建立地图数据
		 * @param mapId
		 * 
		 */		
		public function build( mapId:String ):void
		{
			var bytes:ByteArray = MapModePool.getMapMode(mapId)._cmByte;
			if( bytes == null )
			{
				throw new Error( "Current map data is null. Error map id: " + mapId );
				return;
			}
			
			clearAry();
			_mapId = mapId;
			
			var _$bytes:ByteArray = new ByteArray();
			_$bytes.writeBytes( bytes, 0, bytes.length );
			_$bytes.endian = Endian.LITTLE_ENDIAN;
			_$bytes.uncompress();
			
			// 读数据
			_mapW = _$bytes.readUnsignedInt();
			_mapH = _$bytes.readUnsignedInt();
			_tileW = _$bytes.readUnsignedInt();
			_tileH = _$bytes.readUnsignedInt();
			_hTileW = _tileW * .5;
			_hTileH = _tileH * .5;
			_sliceW = _$bytes.readUnsignedInt();
			_sliceH = _$bytes.readUnsignedInt();
			_sliceW = 256;
			_sliceH = 256;
			
			_col = Math.ceil( _mapW / _tileW );
			_row = Math.ceil( _mapH / _tileH );
			
			var _$x:int=0, _$y:int=0;
			while( _$x < _col )
			{
				_$y = 0;
				this._nodeAry[_$x] = [];
				while( _$y < _row )
				{
					this._nodeAry[_$x][_$y] = new MapTile(_$x, _$y, _$bytes.readByte());
					_$y++;
				}
				_$x++;
			}
			
			// 释放
			bytes = null;
			_$bytes.clear();
			_$bytes = null;
		}
		
		
		
		/**
		 * 获取格子状态 
		 * @param posx
		 * @param posy
		 * @return 如果格子为空，默认返回-1.
		 * 
		 */		
		public function getTileStatus( posx:int, posy:int ):int
		{
			var tile:MapTile = _nodeAry[posx][posy];
			if( tile )
			{
				return tile.flag;
			}
			return -1;
		}
		
		
		/**
		 * 是否可行走 
		 * @param posx
		 * @param posy
		 * @return 
		 * 
		 */		
		public function isBlock( posx:int, posy:int ):Boolean
		{
			return this._nodeAry[posx][posy].flag == 1;
		}
		
		/**
		 * 是否为阴影 
		 * @param posx
		 * @param posy
		 * @return 
		 * 
		 */		
		public function isShadow( posx:int, posy:int ):Boolean
		{
			return this._nodeAry[posx][posy].flag == 2;
		}
		
		
		/**
		 * 获取格子数据 
		 * @param posx	列
		 * @param posy	行
		 * @return 
		 * 
		 */		
		public function getTileData( posx:int, posy:int ):MapTile
		{
			var tile:MapTile = this._nodeAry[posx][posy];
			return tile;
		}
		
		
		/**
		 * 获取格子数据组 
		 * @return 
		 * 
		 */		
		public function getTileAry():Array
		{
			return _nodeAry;
		}
		
		
		/**
		 * 地图宽度 
		 * @return 
		 * 
		 */		
		public function get mapW():uint
		{
			return _mapW;
		}
		
		/**
		 * 地图高度 
		 * @return 
		 * 
		 */		
		public function get mapH():uint
		{
			return _mapH;
		}
		
		
		/**
		 * 地图切片的宽度 
		 * @return 
		 * 
		 */		
		public function get sliceW():uint
		{
			return _sliceW;
		}
		
		
		/**
		 * 地图切片的高度 
		 * @return 
		 * 
		 */		
		public function get sliceH():uint
		{
			return _sliceH;
		}
		
		/**
		 * 获取地图id 
		 * @return 
		 * 
		 */		
		public function get mapId():String
		{
			return _mapId;
		}
		
		/**
		 * 获取地图格子宽度 
		 * @return 
		 * 
		 */		
		public function get tileW():uint
		{
			return _tileW;
		}
		
		/**
		 * 获取地图格子高度 
		 * @return 
		 * 
		 */		
		public function get tileH():uint
		{
			return _tileH;
		}
		
		
		/**
		 * 获取地图格子一半宽度 
		 * @return 
		 * 
		 */	
		public function get hTileW():uint
		{
			return _hTileW;
		}
		
		/**
		 * 获取地图格子一半高度 
		 * @return 
		 * 
		 */		
		public function get hTileH():uint
		{
			return _hTileH;
		}
		
		/**
		 * 获取列数 
		 * @return 
		 * 
		 */		
		public function get col():int{
			return _col;
		}
		
		/**
		 * 获取行数 
		 * @return 
		 * 
		 */		
		public function get row():int{
			return _row;
		}
		
		
		/**
		 * 清理格子组中的数据 
		 * 
		 */		
		private function clearAry():void
		{
			if( !_nodeAry || _nodeAry.length == 0 )
			{
				return;
			}
			
			for( var i:int=0; i<_nodeAry.length; i++ )
			{
				_nodeAry[i].length = 0;
			}
			_nodeAry.length = 0;
		}
		
		
		/**
		 * 释放 
		 * 
		 */		
		public function die():void
		{
			_mapId = null;
			_mapW = NaN;
			_mapH = NaN;
			_tileW = NaN;
			_tileH = NaN;
			_sliceW = NaN;
			_sliceH = NaN;
			_col = NaN;
			_row = NaN;
			clearAry();
			_nodeAry = null;
		}
	}
}